package com.example.springweb.utils;

import com.example.springweb.pojo.User;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.concurrent.TimeUnit;

@Component
public class AccountLockedUtils {

    @Autowired
    com.example.springweb.utils.RedisUtils redisUtils;

    /**
     *  获取错误次数
     *
     * @param userName 用户名
     * @return Integer 返回错误次数,若redis里不存在该用户,返回0
     */
    public Integer getErrorFrequency(String userName) {
        String frequency = redisUtils.get(userName);
        if (StringUtils.isEmpty(frequency)) {
            return 0;
        }
        else {
            return Integer.valueOf(redisUtils.get(userName));
        }
    }

    /**
     *  判断帐号是否被锁住
     *
     * @param userName 用户名
     * @return boolean ture表示被锁
     */
    public boolean isAccountLocked(String userName) {
        String account = redisUtils.get(userName);
        return !StringUtils.isEmpty(account) && account.equals("3");
    }

    /**
     *  查看帐号还有多久解锁
     *
     * @param user 用户pojo
     * @return Long 表示还有多久解锁,单位:s
     */
    public Long getAccountLockedTime(User user) {
        Long expire = redisUtils.getExpire(user.getUser(), TimeUnit.SECONDS);
        return expire >=0 ? expire:0;
    }

    /**
     *  添加次数,若:
     *      第一次输错密码: Redis数据库添加key:value    userName:"1"
     *      第二次输错密码: Redis数据库修改key:value    userName:"2"
     *      第三次输错密码: Redis数据库修改key:value    userName:"3", 且设置其1个小时之后过期
     *
     * @param userName 用户名
     */
    public void addFrequencyForAccountLocked(String userName) {
        String errorFrequency = redisUtils.get(userName);
        if (StringUtils.isEmpty(errorFrequency)) {
            redisUtils.set(userName, "1");
        }
        else {
            switch (redisUtils.get(userName)) {
                case "1":
                    redisUtils.set(userName, "2");
                    break;
                case "2":
                    redisUtils.setEx(userName, "3", 1, TimeUnit.HOURS);
                    break;
            }
        }
    }

    /**
     *  当帐号未被锁定,输入密码正确时,应当清除掉数据库中输入密码错误的次数
     *
     * @param userName 用户名
     */
    public void cleanFrequencyForAccountLocked(String userName) {
        String frequency = redisUtils.get(userName);
        if (!StringUtils.isEmpty(frequency) && !frequency.equals("3")) {
            redisUtils.delete(userName);
        }
    }
}
